/**
 *     FM11NC08I nfc 模块库 (基于Hi3861 i2c通信)
 * 编写函数;
 * 1. NfcInit();
 * 2. 
 * 
 *
 * Code By: HelloKun 2021.09.03
 * */

#ifndef NFC_BINGO_H
#define NFC_BINGO_H

#include <stdint.h>

#define NFC_I2C_IDX 0  //==hi3861 i2c0
#define NFC_SDA_IO13 13
#define NFC_SCL_IO14 14

/**nfc-FM11NC08I 相关寄存器地址address
 * 非接触口是指： 非i2c
 * 设备地址：8bit 
 * 系统寄存器地址是：16bit （i2c是每8bit传输，要传两次）
 */
#define NFC_I2C_ADDR  0xAF  //==NFC slave地址默认 b1010111（0x57） 最低位 默认0-写、1读
#define NFC_I2C_WRITE 0xAE //==NFC slave地址 写模式
#define NFC_I2C_READ  0xAF  //==NFC slave地址 读模式
#define NFC_FIFO_ACCESS  0xFFF0   //==FIFO 访问寄存器
#define NFC_FIFO_FLUSH   0xFFF1   //==FIFO 清零寄存器 向此地址写任意数据时硬件自动刷新 FIFO
#define NFC_FIFO_WORDCNT 0xFFF2   //==FIFO 水平线寄存器
#define NFC_RF_STATUS    0xFFF3   //==非接触口工作状态寄存器
#define NFC_RF_TXEN      0xFFF4   //==非接回发使能
#define NFC_RF_BAUD      0XFFF5   //==非接触端口波特率选择
#define NFC_RF_RATS      0xFFF6   //==非接触端口回发使能
#define NFC_MAIN_IRQ     0xFFF7   //==主中断标志寄存器
#define NFC_FIFO_IRQ     0xFFF8   //==FIFO 中断标志寄存器
#define NFC_AUX_IRQ      0xFFF9   //==辅助中断标志寄存器
#define NFC_MAIN_IRQ_MASK 0xFFFA  //==主中断标志屏蔽寄存器
#define NFC_FIFO_IRQ_MASK 0xFFFB  //==FIFO 中断标志屏蔽寄存器
#define NFC_AUX_IRQ_MASK  0xFFFC  //==辅助中断标志屏蔽寄存器
#define NFC_CFG           0XFFFD
#define NFC_REGU_CFG      0XFFFE


/**nfc-FM11NC08I 寄存器初始化配置值
 * 进场：nfc设备有接近卡、手机等设备
 * 回发：mcu在FIFO中写入数据，nfc读取FIFO中的数据并发送
 * 传输的数据DATA: 均是8bit
 */ 
//0. 设置波特率
#define NFC_I2C_BAUDRATE (106*1000) //设置Hi3861 i2c0 波特率 106k
#define DATA_RF_BAUD 0x00 //tx、rx 106K

//1. EEPROM 配置信息
#define NFC_CONFIG_ADDR 0x03B2 //==NFC-Config  EEPROM Byte Address 
 /*FM11NC08 芯片上电后会自动从 EEPROM 中读取 NFC 配置信息并写入 NFC_CFG 寄存器中
        芯片上电后 MCU 也可以通过接触口直接修改 NFC_CFG 寄存器，以覆盖 EEPROM 中下载的初始值，
        但是要注意寄存器中的配置信息在下电后无法保存*/

#define NFC_CFG_MODE3 0x04        //==0000 0100 开启进场中断、选卡完成后中断
/**
 *  此模式下 FM11NC08 只负责 ISO14443-3 协议的处理，当完成选卡流程并进入 SELECTED 状态后，
    后续接收到的数据全部写入 FIFO，MCU 可以通过 I2C 或 SPI 总线读取 FIFO 中的数据，后续的协
    议和数据处理由 MCU 自行完成。在回发流程中，MCU 将回发数据写入 FIFO，FM11NC08 自动从
    FIFO 读取数据并发送，直到 FIFO 空，并在数据回发结束后自动加上 2 字节 CRC
*/
       
#define NFC_CFG_MODE4 0x00 //==0000 0000 开启进场中断、选卡完成后中断
/**
 * 此模式下 FM11NC08 除了自动处理 ISO14443-3 协议外，还会自动处理 RATS、PPS 和 DESELECT
命令。当芯片完成 RATS 和 PPS 流程后，后续数据帧的接收和回发都通过 FIFO 由 MCU 处理。
*/

//2. 非接回发使能
#define DATA_RF_TXEN 0x55 //==MCU向Register：NFC_TXEN 写 0x55 时触发非接触口回发数据。

//3. 中断（读、写）
//读
/*#//==read  AUX_IRQ、FIFO_IQR、MAIN_IRQ  默认值：
DATA_AUX_IRQ      0x00
DATA_FIFO_IQR     0x00  意：系统刚上电时就会产生 FIFO 空中断，用户可以先读此寄存器清除空中断或直接 mask
DATA_MAIN_IRQ     0x00   最低位表示 AUX_IRQ 各 bit 的或逻辑结果。此位置ǿ1Ȁ表示有辅助中断产生，MCU 应去查询辅助中断标志寄存器
*/
//写
#define DATA_AUX_IRQ_MASK 0x00
#define DATA_FIFO_IRO_MASK 0x01 //==屏蔽FIFO空中断
#define DATA_MAIN_IRQ_MASK 0x00



/**
 * @ NFC Initialize.
 * */
uint32_t NFC_Init(void);

#endif